package com.briup.day09;

import java.time.LocalDate;
import java.time.LocalDateTime;

public class PrintTest {
    public static void main(String[] args) {
        // System.out中的println方法：将你传入的数据打印输出到控制台中
        // 如传入字符串：
        System.out.println("123");

        // 以下的println方法都是参数类型为Object类型的方法
        // 传入null对象
        Object obj = null;
        System.out.println(obj);
        // 传入一个日期对象，LocalDate（获取你当前的当地日期，不包含时分秒的时间）
        // 如果需要获取到时分秒这些时间，需要使用LocalDateTime
        LocalDateTime dateTime = LocalDateTime.now();
        // LocalDateTime输出的是标准化的日期字符串，
        // 因为它在类中重写了从Object类中继承的toString()方法
        System.out.println(dateTime);
        System.out.println(LocalDate.now());
        // 输出数组对象
        int[] ints = new int[3];
        // 因为数组类没有如Object、String这些类一样的具体的类文件，
        // 所以无法将从Object类中继承下来的toString()、equals()等方法进行重写，
        // 所以数组对象直接通过sout输出，永远也只能是输出数组的对象地址格式内容
        System.out.println(ints);

        /*
         以上调用的都是System.out.println()方法，为什么传入的对象不同，
         输出内容的格式形态都有所差异？
            1、由于System.out.println()需要兼容的类型比较多，为了实现所有类型都能够
            正常传入和输出，所以JDK在设计该方法时，对该方法进行了重载编写，如将所有的基本数据类型
            变量输出都进行了支持，对于引用数据类型，除了String类和char[]比较特殊外，其他所有类对象
            的输出都通过System.out.println(Object x)方法进行输出，因为Object类型是Java所有类
            的父类/基类，所以Object类型的变量天然就能够接收所有类型的对象
            2、传入的是引用数据类型的对象，都是Object类型子类，而在System.out.println(Object x)
            方法第一行String s = String.valueOf(x)语句调用时，会执行String.valueOf(x)方法内部的
            return (obj == null) ? "null" : obj.toString()语句，内部关键是执行obj.toString()方法，
            而toString()方法是定义在Object类中，所有子类都需要的方法，如果子类对该方法进行了重写，那么
            使用子类对象调用obj.toString()时，正在执行的是子类重写后的方法；如果没有重写，那么执行的是
            Object类中编写的原始逻辑；

            我们将使用同一个父类的引用，接收来自于不同子类的对象，然后使用父类引用调用共同方法，
            最终根据不同的子类对象执行同一个方法，但是输出的内容形式不同的情况 称之为 面向对象的多态

            多态有哪些优点?
            如果我们要设计一个体育比赛运动场地类，允许所有的球类运动在这里参加比赛，我们应该如何设计？
         */
    }
}
